#include<stdio.h>

//__FILE__ :预处理符号，在预处理阶段替换成当前符号所在的文件名类型为字符串
//__LINE__ :预处理符号, 在预处理阶段替换成当前符号所在的文件的具体行数类型为int

//不定宏参数的使用: ... 可变参数符号，不确定传入的参数是多少，在宏定义中通常搭配##__VA_ARGS__使用
//Print(fmt,...) 预处理替换时 "%s" 替换fmt ,"jjjj"替换 ...
//##__VA_ARGS__：若可变参数为空，C99标准要求逗号必须保留（可能引发语法错误）。
//GCC/Clang通过##__VA_ARGS__优化,展开时自动去掉前面的逗号

//当多个字符串写在一起时编译预处理时会自动把多个字符串拼接在一起
//"ddd""dasd""asdsa" --> "ddddsdadsadsa"
#define Print(fmt,...) printf("[%s %d]"fmt"\n",__FILE__,__LINE__,##__VA_ARGS__)
int main()
{
    printf("[%s %d] %s\n",__FILE__,__LINE__,"jhhh");
    Print("%s","jjjj");
    Print("gggg");//传入的可变参数为空
    Print("ddd""fff");
    return 0;
}